StayOnTop pres vsechny formulare

Otázka od: Daniel Frantik

1. 10. 2002 18:46

Dobry den,
  potrebuji vytvorit formular, ktery bude navrchu uplne vzdy. Tento formular
ale neni hlavnim formem aplikace (a ani nechci, aby mel ikonu v liste).
 V konferenci jsem nasel tato reseni reseni(ani jedno nefunguje na 100%)

   1)SetWindowPos(Form1.Handle, HWND_TOPMOST, Left, Top, Width, Height,
     SWP_NOMOVE or SWP_NOSIZE); //- nedela nic - alespon se mi to zda

  2) Form.Activate ...
  SetWindowLong(Handle, GWL_HWNDPARENT, 0);

    SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width,
                  Height, SWP_NOMOVE or SWP_NOSIZE);
   //V podstate udela z meho formu hlavni form a pak to funguje - jenze pri
deaktivaci zmizi hlavni form a dostanu se na nej jen pokud ten svuj zavru

  3) Udelat z tohoto formu ten hlavni ... (nic moc)

Celou situaci jeste trochu komplikuje to, ze hlavni form bude obcas
invisible (s ikonou v Tray)
Meni se neco pro "StayOnTop", pokud jako ownera vytvoreneho formu dam [nil,
MainForm, Application]?


Diky za napady

Danik

Odpovedá: ing. Jan Fiala

2. 10. 2002 4:42

Nebylo by rozumnejsi, udelat to jako samostatnou aplikaci, ktera by s
tou hlavni komunikovala pomoci zprav ?

--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

1.10.2002 Daniel Frantik:
> Dobry den,
> potrebuji vytvorit formular, ktery bude navrchu uplne vzdy. Tento formular
> ale neni hlavnim formem aplikace (a ani nechci, aby mel ikonu v liste).
> V konferenci jsem nasel tato reseni reseni(ani jedno nefunguje na 100%)

> 1)SetWindowPos(Form1.Handle, HWND_TOPMOST, Left, Top, Width, Height,
> SWP_NOMOVE or SWP_NOSIZE); //- nedela nic - alespon se mi to zda

> 2) Form.Activate ...
> SetWindowLong(Handle, GWL_HWNDPARENT, 0);

> SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width,
> Height, SWP_NOMOVE or SWP_NOSIZE);
> //V podstate udela z meho formu hlavni form a pak to funguje - jenze pri
> deaktivaci zmizi hlavni form a dostanu se na nej jen pokud ten svuj zavru

> 3) Udelat z tohoto formu ten hlavni ... (nic moc)

> Celou situaci jeste trochu komplikuje to, ze hlavni form bude obcas
> invisible (s ikonou v Tray)
> Meni se neco pro "StayOnTop", pokud jako ownera vytvoreneho formu dam [nil,
> MainForm, Application]?


> Diky za napady

> Danik

Odpovedá: Daniel Frantik

2. 10. 2002 13:52

Take me to napadlo,
  ale jedna se v podstate o stavovy hint te aplikace v tray. Tak mi
pripadalo delat na to dalsi 300kb exe trochu moc ....

Cele je to vlastne o tom, jak udelat maly zluty formular, ktery bude nekde
pripichnuty, zatimco aplikace je v tray ... (v praxi ji spis schovam v
taskbaru, mainform.hide a pridam, ikonu do tray ...)

Danik
PS: Zatim se mi podarilo pomoci varianty 2) dosahnout stavu, ze pokud je
"aplikace schovana v tray" tak je hintForm opravdu stayOnTop pres vsechno ve
Win. Jen jeste zustava na taskbaru (MainForm tam odkaz nema ...). Samozrejme
ze ShowWindow(Application.Handle, sw_hide); v tomto pripade (na hintForm)
nefunguje.

> Nebylo by rozumnejsi, udelat to jako samostatnou aplikaci, ktera by s
> tou hlavni komunikovala pomoci zprav ?
>
> --
> ing. Jan Fiala
>
> 1.10.2002 Daniel Frantik:
> > Dobry den,
> > potrebuji vytvorit formular, ktery bude navrchu uplne
> vzdy. Tento formular
> > ale neni hlavnim formem aplikace (a ani nechci, aby mel
> ikonu v liste).
> > V konferenci jsem nasel tato reseni reseni(ani jedno
> nefunguje na 100%)
>
> > 1)SetWindowPos(Form1.Handle, HWND_TOPMOST, Left, Top,
> Width, Height,
> > SWP_NOMOVE or SWP_NOSIZE); //- nedela nic - alespon se
> mi to zda
>
> > 2) Form.Activate ...
> > SetWindowLong(Handle, GWL_HWNDPARENT, 0);
>
> > SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width,
> > Height, SWP_NOMOVE or SWP_NOSIZE);
> > //V podstate udela z meho formu hlavni form a pak to
> funguje - jenze pri
> > deaktivaci zmizi hlavni form a dostanu se na nej jen pokud
> ten svuj zavru
>
> > 3) Udelat z tohoto formu ten hlavni ... (nic moc)
>
> > Celou situaci jeste trochu komplikuje to, ze hlavni form bude obcas
> > invisible (s ikonou v Tray)
> > Meni se neco pro "StayOnTop", pokud jako ownera vytvoreneho
> formu dam [nil,
> > MainForm, Application]?
>
>
> > Diky za napady
>
> > Danik
>
>

Odpovedá: Daniel Frantik

2. 10. 2002 13:38

Tak jsem to nakonec poskladal z ruznych rad z konference...
  Jelikoz je to casty dotaz a v konferenci jsem ucelene reseni nenasel,
posilam pro INSPIRACI svuj kod.
  MainForm je ten hlavni formular, HintForm je ten StayOnTop formular, co ma
byt videt pres vsechny formulare ve windows, kdyz se MainForm schova do tray
...
  Pouzil jsem TrayIcon z RXLib (pro přidání ikony do tray)
  Mozna jsou tam urcita volani zbytecna, ale je to vysledek laborovani ...

Danik
PS: diky vsem za rady.

//--------------------
procedure TMainForm.FormCreate(Sender: TObject);
begin
  HintForm:=THintForm.Create(Self);
end;

procedure TMainForm.TrayIconDblClick(Sender: TObject);
begin
  TrayIcon.Active:=False;
  HintForm.Hide;
  SetWindowLong(Handle, GWL_HWNDPARENT, 0); //Nastavi me jako hlavni form
aplikace
  Show;
  SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
end;

procedure TMainForm.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_SYSCOMMAND then //Nafixluji minimize jako hide a
ikonu do tray (jinak by se minimalizovaly vsechny okna aplikace)
    if (Message.WParam and $FFF0) = SC_MINIMIZE then
    begin
      Hide;
      TrayIcon.Active:=True;
      SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
      HintForm.Show;
      Message.Result := 0;
    end
    else inherited
  else inherited;
end;
//------------------------
procedure THintForm.FormActivate(Sender: TObject);
begin
  if FormStyle = fsStayOnTop then
  begin
    SetWindowLong(Handle, GWL_HWNDPARENT , 0); //Prohlasi tento form za
Parent (asi jako main)
    SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width,
                  Height, SWP_NOMOVE or SWP_NOSIZE); //Nastavi StayOnTop
    SetWindowLong(Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); // Schova ikonu
tohoto noveho "main" z taskbaru
  end;
end;